/**
 * @file delay.c
 * @author liqiang (liqiang@hacint.com.cn)
 * @brief 
 * @version 1.0.0
 * @date 2023-08-15
 * 
 * 
 */
#include "HAL_Delay.h"
#include "delay.h" 
#include "SmartBuzzer.h"

/**
 * @brief us延时倍乘数
 * static 仅在本地使用
 * 
 */
static u32 fac_us=0;							


 
/**
 * @brief systick中断服务函数
 * 
 */
void SysTick_Handler(void)
{	
 
	HAL_IncTick();
	SmartBuzzerFlashLoop();
 
}

			   
/**
 * @brief 初始化延迟函数
 * 
 * @param SYSCLK :系统时钟频率
 */
void delay_init(u8 SYSCLK)
{

	u32 reload=0;

	HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); 
	fac_us=SYSCLK;								 
	reload=SYSCLK;					    		    
	reload*=1000000/1000;						 	
	SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;	 
	SysTick->LOAD=reload; 						 	
	SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; 	 
}	

void	Plat_delay_Init(void){

	delay_init(180);
}						    

 
/**
 * @brief 延时nus
 *  注意SYSTICK是一个递减的计数器
 * @param nus :nus为要延时的us数.	0~190887435(最大值即2^32/fac_us@fac_us=22.5)	
 * @return * void 
 * 
 */
void delay_us(u32 nus)
{		
	u32 ticks=0;
	u32 told=0;
	u32 tnow=0;
	u32 tcnt=0; 
	u32 reload=0; 

	reload=SysTick->LOAD;	 
	ticks=nus*fac_us; 						 
	told=SysTick->VAL;        				 
	while(1)
	{
		tnow=SysTick->VAL;	
		if(tnow!=told)
		{	    
			if(tnow<told)tcnt+=told-tnow;	 
			else tcnt+=reload-tnow+told;	    
			told=tnow;
			if(tcnt>=ticks)break;			 
		}  
	};
}

/**
 * @brief 延时nms
 * 
 * @param nms :要延时的ms数
 */
void delay_ms(u16 nms)
{
	u32 i;
	for(i=0;i<nms;i++) delay_us(1000);
}
 
			 



































